<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>

    
    function Cat(name,color){
        this.name = name;
        this.color = color;

        Object.defineProperty(this,"age",{
            value:1,
            writable:false,
            enumerable:false,
            configurable:false,
        })
    }

    Cat.prototype.species = "Cat";
    Cat.prototype.skill = function(){
        console.log("捉老鼠");
    }
    Cat.prototype.call = function(){
        console.log("喵喵");
    }
    Cat.prototype.say = function(){
        console.log(this.name,this.color);
    }

    Object.prototype.a = 1;
    Object.prototype.b = 2;
    
    var Tom = new Cat("Tom","black");
    console.log(Tom);

    var num = 100;
    var str = "hello";
    var bool = true;
    var arr = [1,2,3];
    var obj = {a:1,b:2};

    // valueOf()  返回实例化对象的值本身
    // console.log(num.valueOf());
    // console.log(str.valueOf());
    // console.log(bool.valueOf());
    // console.log(arr.valueOf());
    // console.log(obj.valueOf());
    // console.log(Tom.valueOf());


    // toString()  将数据转化为字符串
    // console.log(num.toString());  // '100' 
    // console.log(str.toString());  // 'hello'
    // console.log(bool.toString()); // 'true'
    // console.log(arr.toString());  // '1,2,3'  // arr -> Array.prototype.toString -> Object..prototype.toString
    // console.log(obj.toString());  // '[object Object]'
    // console.log(Tom.toString());  // '[object Object]'  自定义构造函数创建的实例化对象转字符串

    // isPrototypeOf()   判断 某个构造函数的原型对象 是否存在于 某个实例化对象的 原型链上

    // Tom的原型链: Tom -> Cat.prototype -> Object.prototype -> null
    // console.log(Cat.prototype.isPrototypeOf(Tom));
    // console.log(Object.prototype.isPrototypeOf(Tom));
    
    // 拓展(了解)
    // instanceof       判断 某个实例化对象 的原型链上是否存在 某个构造函数 的原型对象
    // Tom的原型链: Tom -> Cat.prototype -> Object.prototype -> null
    // console.log(Tom instanceof Cat);
    // console.log(Tom instanceof Object);

    // hasOwnProperty()  判断 某个实例化对象 上是否存在某个属性/方法 (只找实例化对象 不找原型链)
    // console.log(Tom.hasOwnProperty("name"));  // true
    // console.log(Tom.hasOwnProperty("color")); // true  
    
    // console.log(Tom.hasOwnProperty("species")); // false  
    // console.log(Tom.hasOwnProperty("skill")); // false  
    
    // 拓展(了解)
    // key in 对象    判断 某个属性(键名) 是否存在于 某个对象 中(查找原型链)
    
    // for(var key in Tom){  // 遍历对象上所有可枚举属性
    //     console.log(key);
    // }

    // console.log("name" in Tom);  // true
    // console.log("color" in Tom);  // true
    // console.log("species" in Tom); // true
    // console.log("a" in Tom); // true
    // console.log("b" in Tom); // true
    // console.log("toString" in Tom); // true

    // propertyIsEnumerable()  判断 某个实例化对象 上 某个属性  是否可以被枚举 (只找实例化对象本身)

    // console.log(Tom.propertyIsEnumerable("name")); // true
    // console.log(Tom.propertyIsEnumerable("color")); // true
    // console.log(Tom.propertyIsEnumerable("age")); // false
    
    // console.log(Tom.propertyIsEnumerable("species")); // false




</script>
</html>